package com.mdd.front.service.course;

import com.mdd.common.core.PageResult;
import com.mdd.common.entity.course.CourseCatalogue;
import com.mdd.front.validate.CourseStudyParam;
import com.mdd.front.validate.PageParam;
import com.mdd.front.validate.StudyCourseCatalogueParam;
import com.mdd.front.validate.StudyCourseCatalogueScheduleParam;
import com.mdd.front.vo.course.*;

import java.util.List;
import java.util.Map;

/**
 * 课程服务接口类
 */
public interface ICourseService {

    /**
     * 课程列表
     *
     * @param pageParam 分页参数
     * @param params 搜索参数
     * @return PageResult<CourseListVo>
     */
    PageResult<CourseListVo> list(PageParam pageParam, Map<String, String> params);

    /**
     * 我的收藏课程列表
     *
     * @param pageParam 分页参数
     * @return PageResult<CourseListVo>
     */
    PageResult<CourseListVo> favorites(PageParam pageParam);

    /**
     * 我的评价列表
     * @return Map<String, List<CourseMineCommentVo>>
     */
    Map<String, Object> getMyComments(Integer userId);

    /**
     * 获取未评价 已评价个数
     * @param userId
     * @return
     */
    Map<String, Object> getMyCommentCount(Integer userId);


    /**
     * 我的评价列表
     * @return PageResult<CourseMineCommentVo>
     */
    PageResult<CourseMineCommentVo> getMyCommented(PageParam pageParam, Integer userId);

    /**
     * 我的评价列表
     * @return PageResult<CourseMineCommentVo>
     */
    PageResult<CourseMineCommentVo> getMyCommentList(PageParam pageParam, Integer userId, int type);

    /**
     * 我的未评价列表
     * @return PageResult<CourseMineCommentVo>
     */
    PageResult<CourseMineCommentVo> getMyNoComment(PageParam pageParam, Integer userId);

    /**
     * 课程表
     * @param userId 用户id
     * @return List<CourseMineVo>
     */
    Map<String, List<CourseMineVo>> listMine(Integer userId);

    /**
     * 热门课程
     *
     * @param topN 获取的个数
     * @return List<CourseListVo>
     */
    List<CourseListVo> listHotTopN(Integer topN);

    /**
     * 精选课程
     *
     * @return List<CourseListVo>
     */
    List<CourseListVo> listChosen();


    /**
     * 专栏目录列表
     *
     * @param pageParam 分页参数
     * @param params 搜索参数
     * @return PageResult<CourseListVo>
     */
    List<CourseColumnListVo> listColumns(PageParam pageParam, Map<String, String> params, Integer courseId);

    /**
     * 课程详情
     *
     * @param id 主键ID
     * @return CourseDetailVo
     */
    CourseDetailVo detail(Integer id, Integer userId);

    /**
     * 课程目录详情
     *
     * @param id 主键ID
     * @return CourseCatalogue
     */
    CourseCatalogueDetailVo getCourseCatalogueDetail(Integer id, Integer userId);

    /**
     * 课程资料详情
     *
     * @param courseId 课程id
     * @return CourseMaterialDetailVo
     */
    CourseMaterialDetailVo getMaterialDetail(Integer courseId);

    /**
     * 课程收藏
     *
     * @param id 主键ID
     * @param userId 用户id
     * @return boolean
     */
    boolean collect(Integer id, Integer userId);


    /**
     * 完成课程目录学习
     *
     * @param studyCourseCatalogueParam 课程目录学习参数
     * @return boolean
     */
    boolean completeCourseCatalogue(StudyCourseCatalogueParam studyCourseCatalogueParam);


    /**
     * 加入课程
     *
     * @param courseId 课程id
     * @param userId 用户id
     * @return boolean
     */
    boolean addCourseStudy(Integer courseId, Integer userId, Integer sourceId);


    PageResult<CourseListVo> listByCoupon(PageParam pageParam, Integer couponId, String courseName);

    /**
     * 学习课程
     *
     * @param courseId 课程id
     * @param userId 用户id
     */
    boolean studyCourse(Integer courseId, Integer userId);

    /**
     * 更新课程目录学习进度
     *
     * @param studyCourseCatalogueScheduleParam
     * @return boolean
     */
    boolean updateCatalogueSchedule(StudyCourseCatalogueScheduleParam studyCourseCatalogueScheduleParam);
}
